//****************************************************************************//
//* CI7 Libreria grafica                                                     *//
//*	ci7_entity2d.hpp              										 	 *//
//*                                                                          *//
//* ci7.hddisseny.es                                                         *//
//* hddisseny@ci7.hddisseny.es                                               *//
//*																			 *//
//*	Ultima revision - 27/04/2012    										 *//
//****************************************************************************//

#include "ci7.hpp"

// Carga una imagen a la entidad
void CI7_Entity2D::EntityLoad( const char * URI ) {
    _ci7Int_Entity2DPositionX = 0;
    _ci7Int_Entity2DPositionY = 0;

    _ci7Int_Entity2DRGB[0] = 255;
    _ci7Int_Entity2DRGB[1] = 255;
    _ci7Int_Entity2DRGB[2] = 255;

    _ci7Int_Entity2DFX[0] = 255; // alpha
    _ci7Int_Entity2DFX[1] = 1;   // escala
    _ci7Int_Entity2DFX[2] = 0;   // rotacion

    _ci7Int_Texture_SURFACE  = IMG_Load ( URI );

}

// Establece los tonos RGB de la entidad
void  CI7_Entity2D::EntitySetRGB ( float RGB[2] ) {
    _ci7Int_Entity2DRGB[0] = RGB[0];
    _ci7Int_Entity2DRGB[1] = RGB[1];
    _ci7Int_Entity2DRGB[2] = RGB[2];
}

// Establece el alpha ( transparencia ) de la entidad
void  CI7_Entity2D::EntitySetAlpha( float ALPHAA ) {
    _ci7Int_Entity2DFX[0] = ALPHAA;
}

// Establece el angulo de la entidad
void  CI7_Entity2D::EntitySetRotation( float ANGLEE ) {
    _ci7Int_Entity2DFX[2] = ANGLEE;
}

// Establece las dimensiones de la entidad
void  CI7_Entity2D::EntitySetSize( float SIZEE ) {
    _ci7Int_Entity2DFX[1] = SIZEE;
}

// Dibuja la entidad en las posiciones x, y definidas
void  CI7_Entity2D::EntityDraw ( float XX, float YY ) {
    _ci7Int_Entity2DPositionX = XX;
    _ci7Int_Entity2DPositionY = YY;
    _ci7Int_Texture_NCOLORS = _ci7Int_Texture_SURFACE->format->BytesPerPixel;

    if (_ci7Int_Texture_NCOLORS == 4) {
        if (_ci7Int_Texture_SURFACE->format->Rmask == 0x000000ff)
            _ci7Int_Texture_TEXTURE_FORMAT = GL_RGBA;
        else
            _ci7Int_Texture_TEXTURE_FORMAT = GL_BGRA;
    } else if (_ci7Int_Texture_NCOLORS == 3) {
        if (_ci7Int_Texture_SURFACE->format->Rmask == 0x000000ff)
            _ci7Int_Texture_TEXTURE_FORMAT = GL_RGB;
        else
            _ci7Int_Texture_TEXTURE_FORMAT = GL_BGR;
    } else {
        printf("Atencion: La imagen no es de color real, puede que cause errores.\n");
    }

    glGenTextures( 1, &_ci7Int_Texture_TEXTURE );
    glBindTexture( GL_TEXTURE_2D, _ci7Int_Texture_TEXTURE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexImage2D( GL_TEXTURE_2D, 0, _ci7Int_Texture_NCOLORS, _ci7Int_Texture_SURFACE->w, _ci7Int_Texture_SURFACE->h, 0,
                  _ci7Int_Texture_TEXTURE_FORMAT, GL_UNSIGNED_BYTE, _ci7Int_Texture_SURFACE->pixels );
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    glBindTexture( GL_TEXTURE_2D,_ci7Int_Texture_TEXTURE );

    glLoadIdentity();
    glPushMatrix();

    glColor4f( _ci7Int_Entity2DRGB[0],_ci7Int_Entity2DRGB[1],_ci7Int_Entity2DRGB[2],_ci7Int_Entity2DFX[0]/255 );
    glTranslatef ( XX  , YY  ,0 );
    glRotatef( _ci7Int_Entity2DFX[2]  ,0.0f,0.0f,1.0);
    glScaled  ( _ci7Int_Entity2DFX[1],_ci7Int_Entity2DFX[1], 0 );
    glTranslatef ( - XX - ( _ci7Int_Texture_SURFACE->w /2 ) , -  YY- ( _ci7Int_Texture_SURFACE->h /2 )  ,0  );

    glBegin( GL_QUADS );
    glTexCoord2i( 0, 0 );
    glVertex3f( XX, YY, 0 );
    glTexCoord2i( 1, 0 );
    glVertex3f( XX + _ci7Int_Texture_SURFACE->w, YY, 0 );
    glTexCoord2i( 1, 1 );
    glVertex3f( XX + _ci7Int_Texture_SURFACE->w, YY + _ci7Int_Texture_SURFACE->h, 0 );
    glTexCoord2i( 0, 1 );
    glVertex3f( XX, YY + _ci7Int_Texture_SURFACE->h, 0 );
    glEnd();
    glFinish();
    glDeleteTextures(1, &_ci7Int_Texture_TEXTURE);

}

// Devuelve los tonos RGB de la entidad
float*CI7_Entity2D::EntityGetRGB ( void ) {
    return _ci7Int_Entity2DRGB;
}

// Devuelve la posicion X de la entidad
float CI7_Entity2D::EntityGetPositionX ( void ) {
    return _ci7Int_Entity2DPositionX;
}

// Devuelve la posicion Y de la entidad
float CI7_Entity2D::EntityGetPositionY ( void ) {
    return _ci7Int_Entity2DPositionY;
}

// Devuelve el valor alpha ( transparencia ) de la entidad
float CI7_Entity2D::EntityGetAlpha ( void ) {
    return  _ci7Int_Entity2DFX[0];
}

// Devuelve las dimensiones de la entidad
float CI7_Entity2D::EntityGetSize ( void ) {
    return  _ci7Int_Entity2DFX[1];
}

// Devuelve el angulo de rotacion de la entidad
float CI7_Entity2D::EntityGetRotation ( void ) {
    return  _ci7Int_Entity2DFX[2];
}

// Devuelve la superficie en pixels de la entidad
SDL_Surface* CI7_Entity2D::EntityGetTexture ( void ) {
    return _ci7Int_Texture_SURFACE;
}
